package com.pj.sso;

import cn.dev33.satoken.sso.model.SaCheckTicketResult;
import cn.dev33.satoken.sso.processor.SaSsoClientProcessor;
import cn.dev33.satoken.sso.template.SaSsoUtil;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import com.pj.project.sys_user.SysUser;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 前后台分离架构下集成SSO所需的代码
 */
@RestController
public class SsoClientController {

    /**
     * 返回SSO认证中心登录地址 （前后台分离环境下专用）
     */
    @RequestMapping("/sso/getSsoAuthUrl")
    public SaResult getSsoAuthUrl(String clientLoginUrl) {
        String serverAuthUrl = SaSsoUtil.buildServerAuthUrl(clientLoginUrl, "");
        return SaResult.data(serverAuthUrl);
    }

    /**
     * 根据ticket进行登录（前后台分离环境下专用）
     */
    @RequestMapping("/sso/doLoginByTicket")
    public SaResult doLoginByTicket(String ticket) {
        SaCheckTicketResult ctr = SaSsoClientProcessor.instance.checkTicket(ticket, "/sso/doLoginByTicket");
        // 如果 ticket 无效 checkTicket 方法会直接抛出异常，所以此处无需判断 ctr.loginId 是否为null，直接登录即可
        StpUtil.login(ctr.loginId, ctr.remainSessionTimeout);
        StpUtil.getSession().set("user", SsoMethodUtil.getCurrUser());
        return SaResult.data(StpUtil.getTokenValue());
    }


    /**
     * SSO-Client端：处理所有SSO相关请求
     */
    @RequestMapping("/sso/*")
    public Object ssoRequest() {
        return SaSsoClientProcessor.instance.dister();
    }

    /**
     * 重写 /sso/login 增加逻辑：在登录后获取 User 对象缓存到当前Client端的 Session 上
     */
    @RequestMapping("/sso/login")
    public Object ssoDoLogin(String ticket) {
        Object value = SaSsoClientProcessor.instance.ssoLogin();
        if (ticket != null && StpUtil.isLogin()) {
            StpUtil.getSession().set("user", SsoMethodUtil.getCurrUser());
        }
        return value;
    }

    /**
     * SSO-Client端：当前应用独自注销
     */
    @RequestMapping("/sso/logoutByAlone")
    public Object aloneLogout() {
        StpUtil.logout();
        return SaResult.ok();
    }

    /**
     * getInfo接口 （只有登录后才可以调用此接口）
     */
    @RequestMapping("/getCurrInfo")
    public Object getCurrInfo() {
        // 必须登录后才能进入接口
        StpUtil.checkLogin();
        // 从Session中获取user对象
        SysUser user = (SysUser) StpUtil.getSession().get("user");
        return SaResult.data(user);
    }

}
